package reflection;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

// 通过反射操作泛型，获取泛型信息
public class Test7 {
    public void test1(Map<String,User> map, List<User> list){
        System.out.println("test01");
    }

    public Map<String, User> test2(){
        System.out.println("test02");
        return null;
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Method method1 = Test7.class.getMethod("test1", Map.class, List.class);
        // 获得参数类型
        Type[] genericParameterTypes = method1.getGenericParameterTypes();
        for (Type genericParameterType : genericParameterTypes) {
            System.out.println("通用参数类型:" + genericParameterType);
            // 如果获取到的参数属于参数化类型，就获取到实际参数
            if (genericParameterType instanceof ParameterizedType){  //属于
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println(actualTypeArgument);
                }
            }
        }
        /*
            通用参数类型:java.util.Map<java.lang.String, reflection.User>  泛型的参数类型
            class java.lang.String
            class reflection.User
            通用参数类型:java.util.List<reflection.User>   泛型的参数类型
            class reflection.User
         */


        Method method2 = Test7.class.getMethod("test1", Map.class, List.class);
        // 获得参数类型
        Type[] genericParameterTypes1 = method2.getGenericParameterTypes();
        for (Type genericParameterType : genericParameterTypes1) {
            System.out.println("通用参数类型:" + genericParameterType);
            // 如果获取到的参数属于参数化类型，就获取到实际参数
            if (genericParameterType instanceof ParameterizedType){  //属于
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println(actualTypeArgument);
                }
            }
        }
        /*
            通用参数类型:java.util.List<reflection.User>
            class reflection.User
         */
    }

}
